/*****************************************************************************
 *                   Projet MESI : Algo génétique Asynchrone                 *
 *                      Guillaume MONTAVON & Renaud DAVID                    *
 *                                                                           *
 *  Fichier contenant diverses fonctions qui seront utiles dans le projets   *
 *****************************************************************************/

//retourne l'objet XMLHttpRequest selon le navigateur
function getXhr(){
	var xhr = null;
	if(window.XMLHttpRequest) // Firefox et autres
		xhr = new XMLHttpRequest();
	else if(window.ActiveXObject){ // Internet Explorer
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	else { // XMLHttpRequest non supporté par le navigateur
		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
		xhr = false; 
	} 
	return xhr
}

//envoie une requête au serveur avec comme objet le premier paramètre, puis exécute la fonction (2ème paramètre)
function requeteServeur(objet, fonctionExecuter) {

	var xhr = getXhr();
	xhr.onreadystatechange = function() {
		// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
		if(xhr.readyState == 4 && xhr.status == 200) {
			var JSONtext = xhr.responseText;
			try {
				var JSONobject = JSON.parse(JSONtext);
				if(typeof(JSONobject.success) != 'undefined')
					if(!JSONobject.success)
						alert(JSONobject.message);
				eval(fonctionExecuter);
			} catch(e) {
				alert("erreur : "+e);
			}
		}
	};
	xhr.open("GET","requete.php?objet=" + objet + "&idProbleme=" + idProbleme, true);
	xhr.send(null);

}

//envoie une requête au serveur pour vider la population d'individus
function viderPop() {
	
	if(document.getElementById('idProbleme').value > 0) {
		var xhr = getXhr();
		xhr.onreadystatechange = function() {
			// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
			if(xhr.readyState == 4 && xhr.status == 200) {
				var JSONtext = xhr.responseText;
				try {
					var JSONobject = JSON.parse(JSONtext);
					alert("Population vidée, vous pouvez maintenant recommencer le problème en lançant les clients.");
				} catch(e) {
					alert("erreur : "+e);
				}
				
			}
		};
		xhr.open("GET","requete.php?objet=viderPopulation&idProbleme=" + document.getElementById('idProbleme').value, true);
		xhr.send(null);
	}
	else
		alert("Veuillez choisir un problème.");

}

//Mise à jour du meilleur individu dans le client de contrôle
function MAJMeilleurIndiv() {
	document.getElementById("chargementMeilleurIndiv").style.display = "inline";
	requeteServeur("meilleurIndiv", "ModifMeilleurIndiv(JSONobject);");
}

//modifie les champs du meilleur individu dans le client de contrôle
function ModifMeilleurIndiv(JSONobject) {

	if(!traitementTermine(JSONobject.trait)) {

		document.getElementById("fitness").innerHTML = JSONobject.fitness;
		if(JSONobject.id_indiv == 0) {
			document.getElementById("gene0").innerHTML = "Inconnu";
			document.getElementById("gene1").innerHTML = "Inconnu";
		}
			
		for(var i = 0; i < JSONobject.liste_gene.length; i++)
			document.getElementById("gene" + i).innerHTML = JSONobject.liste_gene[i].alleleR + " (" + JSONobject.liste_gene[i].alleleB + ")";
		document.getElementById("chargementMeilleurIndiv").style.display = "none";
	
	}

}

//Mise à jour des statistiques du client de contrôle (nombre d'individus créé, ...)
function MAJStat() {
	document.getElementById("chargementStat").style.display = "inline";
	requeteServeur("etatPop", "ModifStat(JSONobject);");
}

//modifie les champs des statistiques du client de contrôle et affiche un message si le traitement du problème est terminé
function ModifStat(JSONobject) {

	document.getElementById("total").innerHTML = JSONobject.total;
	document.getElementById("actif").innerHTML = JSONobject.actif;
	document.getElementById("nonEval").innerHTML = JSONobject.nonEval;
	document.getElementById("eval").innerHTML = JSONobject.eval;
	document.getElementById("mort").innerHTML = JSONobject.mort;
	document.getElementById("chargementStat").style.display = "none";
	if(JSONobject.trait == 0) {
		document.getElementById("trait").innerHTML = "Arrêté";
		alert("Traitement terminé pour ce problème");
		clearInterval(intervalMeilleurIndiv);
		clearInterval(intervalStat);
	}
	else
		document.getElementById("trait").innerHTML = "Actif";
}

//modifie la taille de la population à l'aide du client de contrôle
function modifierTaillePop() {
	requeteServeur("modifierTaillePop&maxActif=" + document.getElementById("maxActif").value + "&minActif=" + 
	document.getElementById("minActif").value + "&maxCrea=" + document.getElementById("maxCrea").value + "&traitement=" + 
	document.getElementById("traitement").value, "alert('modification effectuée.');");
}

//ajoute des 0 en début du nombre binaire (chaine) jusqu'à ce que celui-ci fasse un certain nombre de caractères (taille)
function ajouteZero(chaine, taille) {
	var tail = chaine.length
	for(var i = 0; i < taille - tail; i++)
		chaine = "0" + chaine;
	return chaine;
}

//permet d'inverser un bit, si nb est à 0, il deviendra 1 et inversement
function inverse(nb) {
	if(nb == 0)
		return 1;
	else if(nb == 1)
		return 0;
	else
		return -1;
}